package verificationcode

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"os"
	"strings"
	"time"
	"wxuser-boot/config"
	"wxuser-boot/model/dto"
	"wxuser-boot/utils"
)

// CheckCaptcha 验证用户输入的验证码是否正确
//
// @Summary 验证用户输入的验证码
// @Description 根据提供的密钥和用户输入的验证码进行验证。
// @ID check-captcha
// @Tags 验证码
// @Accept json
// @Produce json
// @Param captcha body dto.WxUserCaptcha true "包含验证码和校验密钥的对象"
// @Success 200 {object} utils.Response "成功验证，返回验证码状态"
// @Failure 400 {object} utils.Response "请求参数错误或验证码为空"
// @Failure 412 {object} utils.Response "验证码不匹配或已过期"
// @Router /admin/wxUser/checkCaptcha [post]
func CheckCaptcha(c *gin.Context) {
	var captcha dto.WxUserCaptcha
	err := c.BindJSON(&captcha)
	if err != nil {
		utils.Result(c, false, "参数不能为空", http.StatusInternalServerError, nil)
		return
	}
	if captcha.Captcha == "" {
		utils.Result(c, false, "Captcha不能为空", http.StatusInternalServerError, nil)
		return
	}
	if captcha.CheckKey == "" {
		utils.Result(c, false, "CheckKey不能为空", http.StatusInternalServerError, nil)
		return
	}
	lowerCaseCode := strings.ToLower(captcha.Captcha)
	fmt.Println("输入验证码为：" + lowerCaseCode)
	concatenated := lowerCaseCode + captcha.CheckKey
	realKey := utils.Md5Encode(concatenated)
	if value, exists := config.CodeCache.Get(realKey); exists {
		if value == lowerCaseCode {
			utils.Result(c, true, "验证码正确", http.StatusOK, nil)
			return
		}
		utils.Result(c, false, "验证码错误", http.StatusPreconditionFailed, nil)
	} else {
		utils.Result(c, false, "验证码错误", http.StatusPreconditionFailed, nil)
	}
}

// RandomImage 获取验证码
//
// @Summary 获取验证码图像
// @Description 根据提供的密钥生成一个随机的验证码，并返回其作为Base64编码的图像。
// @ID get-random-image
// @Tags 验证码
// @Param key path string true "密钥"
// @Produce json
// @Success 200 {object} utils.Response{data=string} "成功返回包含base64编码的验证码图像"
// @Failure 500 {object} utils.Response "服务器内部错误"
//
// @Security BearerAuth
//
// @Router /sys/randomImage/{key} [get]
func RandomImage(c *gin.Context) {
	key := c.Param("key")
	// 生成随机验证码
	baseCheckCodes := os.Getenv("BASE_CHECK_CODES")
	if baseCheckCodes == "" {
		// 基本字符示例
		baseCheckCodes = "qwertyuiplkjhgfdsazxcvbnmQWERTYUPLKJHGFDSAZXCVBNM1234567890"
	}
	code := utils.RandomString(baseCheckCodes, 4)
	// 第一步：将代码转换为小写
	lowerCaseCode := strings.ToLower(code)
	fmt.Println("生成验证码为：" + lowerCaseCode)
	// 步骤2：将小写代码与密钥连接起来
	concatenated := lowerCaseCode + key
	// 步骤3：计算连接字符串的MD5哈希值
	realKey := utils.Md5Encode(concatenated)
	// 步骤4：将连接字符串存储到缓存中，并设置过期时间为1分钟
	config.CodeCache.Set(realKey, lowerCaseCode, 1*time.Minute)
	// 生成验证码图像
	base64Image, err := utils.GenerateCaptchaImage(code)
	if err != nil {
		fmt.Println("生成验证码图像时出错：", err)
		return
	}
	utils.Result(c, true, "", 0, base64Image)
}
